package models

import (
	"errors"
	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/validation"
	"strconv"
	"time"
)

type Admins struct {
	Id            int       `orm:"column(id);auto" description:"pk_id" json:"id" form:"id"`
	Role          *Roles    `orm:"column(role_id);rel(fk)" description:"角色ID" json:"role" form:"role_id"`
	Username      string    `orm:"column(username);size(50)" description:"用户名" json:"username" form:"username"`
	Password      string    `orm:"column(password);size(200)" description:"密码" json:"-" form:"password"`
	Mobile        string    `orm:"column(mobile);size(20);null" description:"手机" json:"mobile" form:"mobile"`
	Email         string    `orm:"column(email);size(50);null" description:"邮箱" json:"email" form:"email"`
	LoginNum      uint      `orm:"column(login_num);null" description:"登录次数" json:"login_num" form:"login_num"`
	LastLoginTime string    `orm:"column(last_login_time);size(15);null" description:"最后一次登录时间(时间戳)" json:"last_login_time" form:"last_login_time"`
	LastLoginIp   string    `orm:"column(last_login_ip);size(32);null" description:"最后一次登录IP" json:"last_login_ip" form:"last_login_ip"`
	Status        int8      `orm:"column(status)" description:"状态，0:禁用,1:正常" json:"status" form:"status"`
	CreatedAt     time.Time `orm:"column(created_at);type(datetime);null" description:"创建时间" json:"created_at" form:"created_at"`
	UpdatedAt     time.Time `orm:"column(updated_at);type(datetime);null" description:"更新时间" json:"updated_at" form:"updated_at"`
}

// 定义表名
func (m *Admins) TableName() string {
	return "admins"
}

// 初始化表
func init() {
	orm.RegisterModel(new(Admins))
}

// 添加Admin
func (m *Admins) AddAdmins() (err error) {
	o := orm.NewOrm()
	m.CreatedAt = time.Now()
	m.UpdatedAt = time.Now()
	// 校验结构体是否通过
	if err = m.Validation(); err != nil {
		return
	}
	id, err := o.Insert(m)
	// 校验是否插入成功
	if err != nil {
		return
	}
	// 将插入后的ID反射到结构体
	strInt64 := strconv.FormatInt(id, 10)
	m.Id, _ = strconv.Atoi(strInt64)
	return
}

// 根据id删除Admin
func (m *Admins) DeleteAdminsById() (err error) {
	o := orm.NewOrm()
	// 执行删除
	_, err = o.Delete(&Admins{Id: m.Id})
	return
}

// 根据ID修改Admin
func (m *Admins) UpdateAdminsById() (err error) {
	o := orm.NewOrm()
	m.UpdatedAt = time.Now()
	// 校验结构体是否通过
	if err = m.Validation(); err != nil {
		return
	}
	// 执行修改
	_, err = o.Update(m)
	return
}

// 根据id获取Admin结构体
func (m *Admins) GetAdminsById() (err error) {
	o := orm.NewOrm()
	qs := o.QueryTable(m)
	err = qs.Filter("id", m.Id).RelatedSel().One(m)
	if err != nil {
		return err
	}
	return
}

// 根据username获取Admin结构体
func (m *Admins) GetAdminsByUsername() (err error) {
	o := orm.NewOrm()
	qs := o.QueryTable(m)
	err = qs.Filter("username", m.Username).RelatedSel().One(m)
	if err != nil {
		return err
	}
	return
}

// 校验结构体
func (m *Admins) Validation() (err error) {
	valid := validation.Validation{}
	valid.Required(m.Role.Id, "roleId").Message("请选择角色")
	valid.Required(m.Username, "username").Message("用户名不能为空")
	valid.MinSize(m.Username, 5, "usernameMin").Message("用户名不能小于5位")
	valid.MaxSize(m.Username, 20, "usernameMax").Message("用户名不能大于20位")
	valid.Required(m.Password, "password").Message("密码不能为空")
	if m.Mobile != "" {
		valid.Mobile(m.Mobile, "mobile").Message("手机号格式不正确")
	}
	if m.Email != "" {
		valid.Email(m.Email, "email").Message("邮箱格式不正确")
	}
	valid.Range(m.Status, 0, 1, "status").Message("请选择正确的状态")
	// 第一次校验
	if valid.HasErrors() {
		for _, err := range valid.Errors {
			return err
		}
	}
	// 第二次校验
	admin := orm.NewOrm().QueryTable(Admins{})
	role := orm.NewOrm().QueryTable(Roles{})
	if flag := admin.Exclude("id", m.Id).Filter("username", m.Username).Exist(); flag {
		return errors.New("用户名已经存在,请更换用户名")
	}
	if flag := role.Filter("id", m.Role.Id).Exist(); !flag {
		return errors.New("角色ID不存在")
	}
	return
}
